#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<vector>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
#include<iostream>
using namespace std;

typedef void(*call_back)();
void gotask(int i,vector<call_back>& cbs)
{
  cbs[i % 3]();
}
void task1()
{
  int cnt = 5;
  while(cnt--)
  {
    printf("正在执行task1\n");
    sleep(1);
  }
}

void task2()
{
  int cnt = 5;
  while(cnt--)
  {
    printf("正在执行task2\n");
    sleep(1);
  }
}

void task3()
{
  int cnt = 5;
  while(cnt--)
  {
    printf("正在执行task3\n");
    sleep(1);
  }
}
int main(int argc,char *argv[],char *env[])
{
  (void)env;
  if(argc != 2)
  {
    printf("你应该这样使用:%s + 数字\n",argv[0]);
    exit(1);//错误退出
  }
  int num = stoi(argv[1]);
  vector<call_back> cbs;
  vector<pid_t> allId;
  cbs.push_back(task1);cbs.push_back(task2);cbs.push_back(task3);
  for(int i = 0; i < num;i++)
  {
    pid_t id = fork();
    if(id == 0)
    {//child
      gotask(i,cbs);
      exit(10);//子进程需要手动退出，否则执行到父进程的内容
    }
    //father,回子进程
    allId.push_back(id);
  }
    //father,回子进程
  for(auto& pid: allId)
  {
     int status = 0;
     pid_t p =  waitpid(pid,&status,0);
     if(p > 0)
        printf("回收的子进程%d,退出码:%d,信号值:%d\n",p,WEXITSTATUS(status),!WIFEXITED(status));
  }
  return 0;
}
